Ease functions can be used nested, and often need to complete before
performing an action.
This is currently handled by providing onComplete/onStopped callbacks,
which can get tedious when nesting.
To make these cases more convenient, add async variants that return
a promise that is resolved when the transition completes, so that
callers can await the result instead.
In case the transition was interrupted, the promise is rejected with a
CANCELLED error, so that it stops a promises chain and can easily be
filtered out in catch handlers.